/*-------------------<-- Start of Description-->---------------------\ | Insert a row to the current table above or below the current line; | |---------------------<-- End of Description-->----------------------| |--------------------------------------------------------------------| |------------<-- Start of Files or Arguments Needed-->---------------| | Argument: | | insidedata: if you want to use the function inside a data step; | | "T", the function is used inside a step; | | otherwise, it is used outside a data step; | | default is outside a data step; | | position: insert a new row into the table below the current row | | or above; default is below; | | BELOW: insert a row below the current row; | | ABOVE: insert a row above the current row; | | default is BELOW; | | nofrow - num of rows you want to insert: default is 1; | | wordref: word reference; not necessary default is "wordsys"; | | Note: the above parameters have the advantages of both positional | | and keyword parameters: as long as they are provided, not | | matter as a keyword or positional parameter, the fucntion | | will know which one is which; | |-------------<-- End of Files or Arguments Needed-->----------------| |--------------------------------------------------------------------| |------------------<-- Start of Files Created-->---------------------| | Example: data _null_; set one; %insertrows(T); run; | | Usage: insertrows(insidedata, nofrow=1, wordref=wordsys, | | position=BELOW); | \-------------------<-- End of Files Created-->---------------------*/ %macro insertrows(insidedata,nofrow=1, wordref=wordsys,position=BELOW)/parmbuff; /*--------------------------------------------\ | Copy Right: Duo Zhou; | | Created: 2-27-2001 9:44pm; | | Modified: 12-25-2001 4:14am; | | Purpose: Insert a new row; | \--------------------------------------------*/ %local _wcount_ insidedata wsid rc word wordtmp nofrow wordref position; %let _wcount_=0; %do %while(%length(%nrbquote(%scan(&syspbuff, %eval(&_wcount_+1), %str(,()))))); %let _wcount_=%eval(&_wcount_+1); %let word=%qscan(&syspbuff, &_wcount_, %str(,())); %if (%index(%quote(&word),%quote(=))) %then %do; %let wordtmp=%sysfunc(dequote(%qscan(%quote(&word), 2, %str(=)))); %if (not %sysfunc(rxmatch(%sysfunc(rxparse($a|$A|.|_)),&wordtmp))) %then %do; %let nofrow=&wordtmp; %end; %else %if (%index(%quote(%upcase(&word)),POSITION)) %then %do; %let position=&wordtmp; %end; %else %if (%index(%quote(%upcase(&word)),WORD)) or (%index(%quote(%upcase(&word)),WIN)) %then %do; %let wordref=&wordtmp; %end; %else %if (%index(%quote(%upcase(&word)),DATA)) %then %do; %let insidedata=&wordtmp; %end; %end; %else %do; %if (not %sysfunc(rxmatch(%sysfunc(rxparse($a|$A|.|_)),&word))) %then %do; %let nofrow=&word; %end; %else %if (%index(%quote(%upcase(&word)),ABOVE) or %index(%quote(%upcase(&word)),BELOW))%then %do; %let position=&word; %end; %else %if (%index(%quote(%upcase(&word)),WORD)) %then %do; %let wordref=&word; %end; %else %if (%index(%quote(%upcase(&word)),T)) or (%index(%quote(%upcase(&word)),F)) %then %do; %let insidedata=&word; %end; %else %let wordref=&word; %end; %end; %let wsid=0; %if (&wordref ne ) %then %do; %let wsid=%sysfunc(fopen(&wordref,o,132,e)); %end; %if &wsid %then %do; %let rc=%sysfunc(fclose(&wsid)); %if (not %index(%quote(%upcase(&insidedata)), T)) %then %do; data _null_; %end; file &wordref lrecl=2000; %if (%index(%quote(%upcase(&position)),BELOW)) %then %do; str= '[TableInsertRowBelow .NumRows = "'||"&nofrow"||'"]'; put str; %end; %else %if (%index(%quote(%upcase(&position)),ABOVE)) %then %do; str= '[TableInsertRow .NumRows = "'||"&nofrow"||'"]'; put str; %end; %else %do; str= '[TableInsertRowBelow .NumRows = "'||"&nofrow"||'"]'; put str; %end; put '[CharLeft 1]'; %if (not %index(%quote(%upcase(&insidedata)), T)) %then %do; run; %end; %end; %else %do; %put ==> Alert! Incorrect window reference "&wordref", or window "&wordref" isn%str(%')t open.; %end; %mend insertrows;